home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_518 / post / post16s.lzh / postasm.a < prev    next >
Text File  |  1991-04-17  |  5KB  |  160 lines

  1. ;***************************************************************************
  2. ;
  3. ; PostScript interpreter file "postasm.a" - assembler routines (Amiga)
  4. ; (C) Adrian Aylward 1989, 1991
  5. ;
  6. ; This file contains the assembler support routines for the main program.
  7. ; It is Lattice specific.
  8. ;
  9. ;***************************************************************************
  10.  
  11.         include "exec/execbase.i"
  12.         include "exec/tasks.i"
  13.         include "exec/funcdef.i"
  14.         include "exec/exec_lib.i"
  15.         include "libraries/dos.i"
  16.  
  17. ;***************************************************************************
  18. ;
  19. ; The text segment
  20. ;
  21. ;***************************************************************************
  22.  
  23.         csect   text,0
  24.  
  25.         xref    sigint
  26.         xref    sigfpe
  27.  
  28.         xdef    insertbreak
  29.         xdef    deletebreak
  30.         xdef    insertftrap
  31.         xdef    deleteftrap
  32.  
  33. ;***************************************************************************
  34. ;
  35. ; Insert the break exception handler
  36. ;
  37. ;***************************************************************************
  38.  
  39. insertbreak:
  40.         move.l  4,a0                    ; Get ExecBase
  41.         move.l  ThisTask(a0),a0         ; Locate our task
  42.         move.l  TC_EXCEPTCODE(a0),sxcode  ; Save old hanmdler
  43.         move.l  #hbreak,TC_EXCEPTCODE(a0) ; Insert new handler
  44.         rts
  45.  
  46. ;***************************************************************************
  47. ;
  48. ; Delete the break exception handler
  49. ;
  50. ;***************************************************************************
  51.  
  52. deletebreak:
  53.         move.l  4,a0                    ; Get ExecBase
  54.         move.l  ThisTask(a0),a0         ; Locate our task
  55.         move.l  sxcode,TC_EXCEPTCODE(a0)  ; Restore old hanmdler
  56.         rts
  57.  
  58. ;***************************************************************************
  59. ;
  60. ; The break exception handler
  61. ;
  62. ;***************************************************************************
  63.  
  64. hbreak:
  65.         btst    #SIGBREAKB_CTRL_C,d0    ; if this a CTRL/C
  66.         beq.s   hb1
  67.         movem.l d0/d1/a0/a1,-(sp)
  68.         moveq   #1,d0
  69.         move.l  d0,-(sp)
  70.         jsr     sigint                  ; signal interrupt
  71.         addq.l  #4,sp
  72.         movem.l (sp)+,d0/d1/a0/a1
  73. hb1:    rts
  74.  
  75. ;***************************************************************************
  76. ;
  77. ; Insert the floating point trap handler
  78. ;
  79. ;***************************************************************************
  80.  
  81. insertftrap:
  82.         move.l  a6,-(sp)
  83.         move.l  4,a6                    ; Get ExecBase
  84.         btst    #4,AttnFlags+1(a6)      ; See if we have an FPU
  85.         beq.s   if1
  86.         move.l  ThisTask(a6),a0         ; Locate our task
  87.         move.l  TC_TRAPCODE(a0),stcode  ; Save old hanmdler
  88.         move.l  #sftrap,TC_TRAPCODE(a0) ; Insert new handler
  89.         fmove.l fpcr,d0
  90.         move.l  d0,sfpcr                ; Save fpcr
  91.         or.w    #$fd90,d0               ; Set trap flags in fpcr
  92.         fmove.l d0,fpcr
  93. if1:    move.l  (sp)+,a6
  94.         rts
  95.  
  96. ;***************************************************************************
  97. ;
  98. ; Delete the floating point trap handler
  99. ;
  100. ;***************************************************************************
  101.  
  102. deleteftrap:
  103.         move.l  a6,-(sp)
  104.         move.l  4,a6                    ; Get ExecBase
  105.         btst    #4,AttnFlags+1(a6)      ; See if we have an FPU
  106.         beq.s   df1
  107.         move.l  sfpcr,d0                ; Restore fpcr
  108.         fmove.l d0,fpcr
  109.         move.l  ThisTask(a6),a0         ; Locate our task
  110.         move.l  stcode,TC_TRAPCODE(a0)  ; Restore old hanmdler
  111. df1:    move.l  (sp)+,a6
  112.         rts
  113.  
  114. ;***************************************************************************
  115. ;
  116. ; The floating point trap handler
  117. ;
  118. ;***************************************************************************
  119.  
  120. sftrap: cmp.l   #48,(sp)                ; fp traps are 48 - 54
  121.         blo.s   ht1
  122.         cmp.l   #54,(sp)
  123.         bls.s   ht2
  124. ht1:    move.l  stcode,-(sp)            ; not fp, jump to old handler
  125.         rts
  126.  
  127. ht2:    move.l  d0,-(sp)
  128.         fsave   -(a7)                   ; save FPU internal state
  129.         move.b  0(a7),d0                ; first byte of FPU state frame
  130.         beq.s   ht3                     ; branch on null state frame
  131.  
  132.         moveq   #0,D0
  133.         move.b  1(a7),d0                ; load state frame size (in bytes)
  134.         bset    #3,0(a7,d0.l)           ; set FPU exception pending bit (27)
  135.  
  136. ht3:    frestore (a7)+                  ; restore FPU internal state
  137.         addq.l  #4,sp                   ; discard trap number
  138.         move.l  #uftrap,2(sp)           ; update pc with user trap handler
  139.         rte                             ; return to user state, enter trap
  140.  
  141. uftrap: move.l  4,a6                    ; Get ExecBase
  142.         jsr     sigfpe                  ; signal fp error, no return
  143.  
  144. ;***************************************************************************
  145. ;
  146. ; The data segment (bss)
  147. ;
  148. ;***************************************************************************
  149.  
  150.         CSECT   __MERGED,2        ; BSS
  151.  
  152. sxcode: ds.b    4                 ; Saved exception code
  153. stcode: ds.b    4                 ; Saved trap code
  154.  
  155. sfpcr:  ds.b    4                 ; Saved fpcr
  156.  
  157.         end
  158.  
  159. ; End of file "postasm.a"
  160.